﻿//-----------------------------------------------------------------------------------------
// <copyright file="BlipService.Update.cs" company="Jakub Florczyk (www.jakubflorczyk.pl)">
//      Copyright © 2009 Jakub Florczyk (www.jakubflorczyk.pl)
//      http://blipnet.codeplex.com/
// </copyright>
//-----------------------------------------------------------------------------------------

namespace BlipNet
{
    using System;
    using System.Globalization;
    using System.IO;

    /// <summary>
    /// Blip serwis.
    /// </summary>
    public partial class BlipService
    {        
        /// <summary>
        /// Zwraca najnowsze update-y uwierzytelnionego użytkownika.
        /// </summary>
        /// <param name="limit">Limit ilości.</param>        
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetUpdates(int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates?limit={0}", limit));
        }

        /// <summary>
        /// Zwraca najnowsze update-y uwierzytelnionego użytkownika.
        /// </summary>
        /// <param name="limit">Limit ilości.</param>
        /// <param name="offset">Ofset ilości.</param>
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetUpdates(int limit, int offset)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates?limit={0}&offset={1}", limit, offset));
        }

        /// <summary>
        /// Zwraca wszystkie update-y bieżącego użytkownika nowsze od update-u o podanym id.
        /// </summary>
        /// <param name="id">Identyfikator update-u.</param>
        /// <returns>Wszystkie update-y.</returns>
        public Message[] GetUpdatesSince(int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates/{0}/since", id));
        }

        /// <summary>
        /// Zwraca najnowsze update-y od wszystkich użytkowników.
        /// </summary>
        /// <param name="limit">Limit ilości.</param>
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetAllUpdates(int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates/all?limit={0}", limit));
        }

        /// <summary>
        /// Zwraca najnowsze update-y od wszystkich użytkowników.
        /// </summary>
        /// <param name="limit">Limit ilości.</param>
        /// <param name="offset">Ofset ilości.</param>
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetAllUpdates(int limit, int offset)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates/all?limit={0}&offset={1}", limit, offset));
        }

        /// <summary>
        /// Zwraca najnowsze update-y od wszystkich użytkowników nowszych niż podane id..
        /// </summary>
        /// <param name="limit">Limit ilości.</param>
        /// <param name="id">Identyfikator update-u.</param>
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetAllUpdatesSince(int limit, int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/updates/{1}/all_since?limit={0}", limit, id));
        }

        /// <summary>
        /// Zwraca najnowsze update-y podanego użytkownika.
        /// </summary>
        /// <param name="login">Login użytkownika.</param>
        /// <param name="limit">Limit ilości.</param>
        /// <returns>Najnowsze update-y.</returns>
        public Message[] GetUserUpdates(string login, int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/users/{0}/updates?limit={1}", login, limit));
        }

        /// <summary>
        /// Zwraca wszystkie update-y podanego użytkownika nowsze od podanego id.
        /// </summary>
        /// <param name="login">Login użytkownika.</param>
        /// <param name="id">Identyfikator update-u.</param>
        /// <returns>Wszystkie update-y.</returns>
        public Message[] GetUserUpdatesSince(string login, int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/users/{0}/updates/{1)/since", login, id));
        }

        /// <summary>
        /// Zwraca update o podanym id.
        /// </summary>
        /// <param name="id">Identyfikator update-u.</param>
        /// <returns>Wybrany update.</returns>
        public Message GetUpdate(int id)
        {
            return RequestGet<Message>(String.Format(CultureInfo.InvariantCulture, "/updates/{0}", id));
        }

        /// <summary>
        /// Tworzy nowy update, rozróżniając wiadomości od statusów po prefiksie ">ktos:".
        /// </summary>
        /// <param name="body">Treść update-u.</param>
        public void AddUpdate(string body)
        {
            this.RequestPost("/updates", "update[body]", body);
        }

        /// <summary>
        /// Tworzy nowy update, rozróżniając wiadomości od statusów po prefiksie ">ktos:".
        /// </summary>
        /// <param name="body">Treść update-u.</param>
        /// <param name="picture">Obrazek update-u.</param>
        /// <param name="progress">Delegator postępu.</param>
        public void AddUpdate(string body, Stream picture, UploadProgress progress)
        {
            this.RequestUpload("/updates", "update[picture]", "picture.jpg", picture, progress, "update[body]", body);
        }

        /// <summary>
        /// Usuwa update o podanym id.
        /// </summary>
        /// <param name="id">Identyfikator update-u.</param>
        public void RemoveUpdate(int id)
        {
            this.RequestDelete(String.Format(CultureInfo.InvariantCulture, "/updates/{0}", id));
        }
    }
}
